#include <iostream>
#include <stdio.h>

#include <iostream>
#include <vector>

class Solution {
private:
    std::vector<std::vector<std::string>> result;
    std::vector<std::string> path; // 放已经回文的子串
    void backtracking (const std::string& s, int startIndex) {
        // 如果起始位置已经大于s的大小，说明已经找到了一组分割方案了
        if (startIndex >= s.size()) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex; i < s.size(); i++) {
            if (isPalindrome(s, startIndex, i)) {   // 是回文子串
                // 获取[startIndex,i]在s中的子串
                std::string str = s.substr(startIndex, i - startIndex + 1);
                path.push_back(str);
            } else {                                // 不是回文，跳过
                continue;
            }
            backtracking(s, i + 1); // 寻找i+1为起始位置的子串
            path.pop_back(); // 回溯过程，弹出本次已经填在的子串
        }
    }
    bool isPalindrome(const std::string& s, int start, int end) {
        for (int i = start, j = end; i < j; i++, j--) {
            if (s[i] != s[j]) {
                return false;
            }
        }
        return true;
    }
public:
    std::vector<std::vector<std::string>> partition(std::string s) {
        result.clear();
        path.clear();
        backtracking(s, 0);
        return result;
    }
};

int main(int argv, char**argc)
{

    printf("************  test hello zc!!!   **************\n");
    /* add test code! */
    Solution solve;
    std::vector<std::vector<std::string>> ret;
    ret = solve.partition("aab");
    printf("[ \n");
    for(auto p:ret){
        printf("[");
        for(auto q:p){
            printf("%s ", q.data());
        }
        printf("] ");    
    }
    printf("]\n");
    return 0;
}
